package com.itany.corejava.code09_集合.Map;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * @author 石小俊
 * 2024年07月25日 11:07
 * 控制台输入一个字符串,统计字符串中每个字符出现的次数,保存到HashMap集合中
 * 至少使用两种不同的方式实现
 */
public class Test03_练习 {

    public static void main(String[] args) {
        test02();
    }


    /**
     * 方式一:遍历字符串中的每一个字符,每遍历一次操作一次集合
     */
    public static void test01() {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个字符串:");
        String s = sc.nextLine();
        // 定义一个Map集合,用于存储字符与字符出现的字符
        // key:字符,value:字符出现的次数
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            // 取出当前迭代的字符
            char c = s.charAt(i);
            // 判断当前Map集合中是否已经存在对应key的字符
            //if (map.containsKey(c)) {
            //    // 如果已经存在,则取出当前的value
            //    int count = map.get(c);
            //    // 在原有value的基础上+1
            //    // 当key重复时,做的是修改操作
            //    map.put(c, count + 1);
            //} else {
            //    // 如果尚未存在,则添加一组新的键值对数据
            //    // key:当前字符,value:1
            //    map.put(c, 1);
            //}
            // 简写方式
            map.put(c, map.containsKey(c) ? map.get(c) + 1 : 1);
        }
        System.out.println(map);
    }

    /**
     * 方式二:可以通过字符串的第一个字符与整个字符串中所有字母进行比较,将相同字符替换掉空字符串,替换的次数就是出现的次数
     * 当全部替换完了之后再次重复上面的操作,直到字符串为空为止
     */
    public static void test02() {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个字符串:");
        String s = sc.nextLine();
        Map<Character, Integer> map = new HashMap<>();
        // 只要字符串不为空,则一直循环执行替换操作
        while (!s.isEmpty()) {
            // 取出字符串中的第一个字符
            char c = s.charAt(0);
            // 将字符串中所有与第一个字符一致的所有字符全部替换成空字符串
            String s2 = s.replace(c + "", "");
            // 替换次数=原字符串长度-新字符串长度
            map.put(c, s.length() - s2.length());
            // 将新的字符串作为原字符串再次进入循环
            s = s2;
        }
        System.out.println(map);

    }

}
